﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;

namespace SMP.Windows.Forms
{
    public partial class FrmBase : DevExpress.XtraEditors.XtraForm
    {
        private FormState _FormState;
        public FormState FormState
        {
            set { _FormState = value; }
            get { return _FormState; }
        }
        
        
        public FrmBase()
        {
            InitializeComponent();
        }
        
        /// <summary>
        /// Thay đổi trạng thái form ứng với các thao tác cập nhật dữ liệu
        /// </summary>
        /// <param name="state"></param>
        public void ChangeFormState(FormState state)
        {
            switch (state)
            {
                case FormState.Save:
                case FormState.Cancel:
                case FormState.View:
                    item_Save.Enabled = false;
                    item_Cancel.Enabled = false;

                    item_Add.Enabled = true;
                    item_Edit.Enabled = true;
                    item_Delete.Enabled = true;
                    item_Close.Enabled = true;
                    item_Print.Enabled = true;
                    item_Select.Enabled = true;
                    item_Refresh.Enabled = true;


                    this.Text = this.Text.Replace("(*)","");
                    break;
                case FormState.Add:
                case FormState.Edit:
                    item_Save.Enabled = true;
                    item_Cancel.Enabled = true;

                    item_Add.Enabled = false;
                    item_Edit.Enabled = false;
                    item_Delete.Enabled = false;
                    item_Close.Enabled = false;
                    item_Print.Enabled = false;
                    item_Select.Enabled = false;
                    item_Refresh.Enabled = false;

                    this.Text = this.Text + "(*)";
                    break;

            }

            FormState = state;
        }

        #region handle form event
        /// <summary>
        /// Thay đổi trạng thái form ứng với các tác vụ
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void barManager1_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            switch (e.Item.Name)
            {
                case "item_Add":
                    _FormState = Forms.FormState.Add;
                    PerformAdd();
                    ChangeFormState(FormState.Add);
                    ResetText();
                    break;

                case "item_Edit":
                    _FormState = Forms.FormState.Edit;
                    PerformEdit();
                    ChangeFormState(FormState.Edit);
                    break;

                case "item_Delete":
                    PerformDelete();
                    ChangeFormState(FormState.View);
                    break;

                case "item_Save":
                    bool saved = false;
                    saved = PerformSave();
                    if (saved)
                        ChangeFormState(FormState.View);
                    break;

                case "item_Cancel":
                    PerformCancel();
                    ChangeFormState(FormState.View);
                    break;

                case "item_Print":
                    PerformPrintPreview();
                    break;

                case "item_Report":
                    PerformReport();
                    break;

                case "item_Select":
                    PerformSelectOneObject();
                    break;

                case "item_Close":
                    PerformClose();
                    break;

                case "item_Refresh":
                    DisplayInfo();
                    break;

            }
        }
        

        #endregion


        #region virtual methods

        /// <summary>
        /// Thực thi tác vụ xem trên form
        /// </summary>
        /// <returns></returns>
        public virtual bool PerformView() { return true; }
        /// <summary>
        /// Thực thi tác vụ nhấn nút Add
        /// </summary>
        /// <returns></returns>
        public virtual bool PerformAdd() { return true; }
        /// <summary>
        /// Thực thi tác vụ nhấn nút Edit
        /// </summary>
        /// <returns></returns>
        public virtual bool PerformEdit() { return true; }
        /// <summary>
        /// Thực thi tác vụ nhấn nút Delete
        /// </summary>
        /// <returns></returns>
        public virtual bool PerformDelete() { return true; }
        /// <summary>
        /// Thực thi tác vụ nhấn nút Save
        /// </summary>
        /// <returns></returns>
        public virtual bool PerformSave() { return true; }
        /// <summary>
        /// Thực thi tác vụ nhấn nút Save khi cập nhật trực tiếp trên Datasource của form thông qua đối tượng Data (1 property của form)
        /// </summary>
        /// <returns></returns>
        public virtual bool PerformSaveChanges()
        {
            ChangeFormState(FormState.View);
            return true;
        }
        /// <summary>
        /// Thực thi tác vụ nhấn nút Cancel
        /// </summary>
        /// <returns></returns>
        public virtual bool PerformCancel() { return true; }
        /// <summary>
        /// Thực thi tác vụ nhấn nút Print
        /// </summary>
        /// <returns></returns>
        public virtual bool PerformPrintPreview() { return true; }
        /// <summary>
        /// Thực thi tác vụ nhấn nút Thống kê
        /// </summary>
        /// <returns></returns>
        public virtual bool PerformReport() { return true; }
        /// <summary>
        /// Thực thi tác vụ nhấn nút Lập thống kê
        /// </summary>
        /// <returns></returns>
        public virtual bool PerformQuery() { return true; }
        /// <summary>
        /// Thực thi kiểm tra
        /// </summary>
        /// <returns></returns>
        public virtual bool PerformTest() { return true; }
        /// <summary>
        /// Thực thi xác nhận
        /// </summary>
        /// <returns></returns>
        public virtual bool PerformVerify() { return true; }
        /// <summary>
        /// Thực thi tác vụ nhấn nút ToPdf để chuyển dữ liệu trên form sang tập tin pdf
        /// </summary>
        /// <returns></returns>
        public virtual bool PerformToPdf() { return true; }
        /// <summary>
        /// Thực thi tác vụ nhấn nút Close
        /// </summary>
        /// <returns></returns>
        public virtual bool PerformClose()
        {
            this.Close();
            return true;
        }
        /// <summary>
        /// Thực thi tác vụ nhấn nút Select
        /// </summary>
        /// <returns></returns>
        public virtual object PerformSelectOneObject()
        {
            return null;
        }

        /// <summary>
        /// Refresh dữ liệu
        /// </summary>
        public virtual void DisplayInfo()
        {
            
        }

        /// <summary>
        /// Clear All DataBindings tren cac control
        /// </summary>
        public virtual void ClearDataBindings() { }

        /// <summary>
        /// Add DataBindings tren cac control
        /// </summary>
        public virtual void DataBindingControl() { }

        /// <summary>
        /// Thay doi trang thai cac control theo thao cac thao tac them/sua/xoa
        /// </summary>
        /// <param name="editTable"></param>
        public virtual void ChangeStatus(bool editTable)
        {
        }

        /// <summary>
        /// Reset text/editvalue tren cac control khi them/sua
        /// </summary>
        public virtual void ResetText()
        {
        }
        #endregion

        private void FrmBase_Load(object sender, EventArgs e)
        {
            ChangeFormState(Forms.FormState.View);
            DisplayInfo();
        }


        /// <summary>
        /// gridControl.EmbeddedNavigator.Buttons.EndEdit.DoClick()
        /// </summary>
        /// <param name="gridControl"></param>
        public void DoClickEndEdit(DevExpress.XtraGrid.GridControl gridControl)
        {
            try
            {
                gridControl.EmbeddedNavigator.Buttons.DoClick(gridControl.EmbeddedNavigator.Buttons.EndEdit);
            }
            catch (Exception ex)
            {
                Windows.Forms.Message.Show(ex.Message, ex.ToString());
            }
        }








    }
}